package vip.xiaonuo.sys.modular.sensor;

import cn.hutool.http.HttpUtil;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;

@Service
public class SensorInfoServer {

    @Resource
    private SystemInfo systemInfo;

    /**
     * 1、养殖场信息查询
     */
    public void getFramInfo(DeviceInfo deviceInfo) {

        Long timeMillis = System.currentTimeMillis();

        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 分页查询页数，从 1 开始
        paramMap.put("pageNum", 1);
//        // 省
//        paramMap.put("province", "北京");
//        // 市
//        paramMap.put("city", "北京");
        String result3= HttpUtil.get(systemInfo.getFramInfo(), paramMap);
    }

    /**
     * 15、机构采集器日志查询
     */
    public void getMechanicalCollector(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备编号
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        // 页码，最小 1
        paramMap.put("pageNum", 1);
        // 每页条数，最大 100
        paramMap.put("pageSize", 100);
//        // 开始日期 yyyy-MM-dd
//        paramMap.put("beginDate", "开始日期 yyyy-MM-dd");
//        // 截至日期 yyyy-MM-dd
//        paramMap.put("endDate", "截至日期 yyyy-MM-dd");
        String result3= HttpUtil.post(systemInfo.getMechanicalCollector(), paramMap);
    }

    /**
     * 14、机构计步器日志查询
     */
    public void getInstitutionalPedometer(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备编号
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        // 页码，最小 1
        paramMap.put("pageNum", 1);
        // 每页条数，最大 100
        paramMap.put("pageSize", 100);
//        // 开始日期 yyyy-MM-dd
//        paramMap.put("beginDate", "开始日期 yyyy-MM-dd");
//        // 截至日期 yyyy-MM-dd
//        paramMap.put("endDate", "截至日期 yyyy-MM-dd");
        String result3= HttpUtil.get(systemInfo.getInstitutionalPedometer(), paramMap);
    }

    /**
     * 13、机构项圈日志查询
     */
    public void getMechanismCollar(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备编号
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        // 页码，最小 1
        paramMap.put("pageNum", 1);
        // 每页条数，最大 100
        paramMap.put("pageSize", 100);
//        // 开始日期 yyyy-MM-dd
//        paramMap.put("beginDate", "开始日期 yyyy-MM-dd");
//        // 截至日期 yyyy-MM-dd
//        paramMap.put("endDate", "截至日期 yyyy-MM-dd");
        String result3= HttpUtil.get(systemInfo.getMechanismCollar(), paramMap);
    }

    /**
     * 12、机构计步器日志查询
     */
    public void getSetHz(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备id
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        // 白天间隔分钟 （8： 00-20： 00） ，时间间隔为 1-240 分钟之间
        paramMap.put("dayTimes", deviceInfo.getDayTimes());
        //晚间间隔分 （20:00-08:00） ，时间间隔为 30-240 分钟之间
        paramMap.put("eveningTimes", deviceInfo.getEveningTimes());

        String result3= HttpUtil.get(systemInfo.getSetHz(), paramMap);
    }

    /**
     * 11、机构设备状态查询
     */
    public void getOrganState(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备id
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        // 查询类型:1 主机, 2 耳标, 3脚环, 4 项圈, 5 环控  todo:
        paramMap.put("type", DeviceEnum.XQ.getCode());
        String result3= HttpUtil.get(systemInfo.getOrganState(), paramMap);
    }

    /**
     * 10、设备日志查询
     */
    public void getDeviceLog(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备id
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        String result3= HttpUtil.get(systemInfo.getDeviceLog(), paramMap);
    }

    /**
     * 9、机构设备状态查询
     */
    public void getDeviceStatus(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        // 设备id
        paramMap.put("deviceId", deviceInfo.getDeviceId());
        String result3= HttpUtil.get(systemInfo.getDeviceStatus(), paramMap);
    }

    /**
     * 机构设备明细查询
     */
    public void getDeviceInfo(DeviceInfo deviceInfo) {
        Long timeMillis = System.currentTimeMillis();
        HashMap<String, Object> paramMap = new HashMap<>();
        // 机构 ID
        paramMap.put("organId", deviceInfo.getOrganId());
        // 请求时的时间戳，毫秒
        paramMap.put("timestamp", timeMillis);
        // organId + timestamp +秘钥,进行 md5 加密后的小写字符串
        paramMap.put("sign", md5(deviceInfo.getOrganId() + timeMillis + systemInfo.getKey()));
        String result3= HttpUtil.get(systemInfo.getDeviceInfo(), paramMap);
    }


    public static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] messageDigest = md.digest(input.getBytes());
            StringBuilder hexString = new StringBuilder();
            for (byte b : messageDigest) {
                String hex = Integer.toHexString(0xff & b);
                if (hex.length() == 1) {
                    hexString.append('0');
                }
                hexString.append(hex);
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }

}
